Technical Q&A QA1147
Programmatic configuration of a Movie Export Component


Q: ÉÄÅ[ÉrÅ[Çíºê⁄ÅAîÒà≥èkÇà AVI ÉtÉ@ÉCÉãÇ…ÉGÉNÉXÉ|Å[ÉgǵÇÊǧÇΔǵǃǢNjÇ∑ÅBQuickTime Ç…ëgÇ›çûÇ‹ÇÍǃǢÇÈÉGÉNÉXÉ|Å[É^ÇégǡǃǛNjǵÇΩÇ™ Cinepak à≥èk AVI ǵǩìæÇÁÇÍǻǢÇÊǧÇ≈Ç∑ÅB MovieExportDoUserDialog ÇégǡǃÉGÉNÉXÉ|Å[ÉgÉ_ÉCÉAÉçÉOÇï\é¶Çµê›íËÇïœçXÇ∑ÇÈDZÇΔLJÇ≈Ç´ÇÈÇÃÇ≈Ç∑Ç™ÅAǪÇÍÇÕǵÇΩÇ≠džÇËÇ‹ÇπÇÒÅBÉvÉçÉOÉâÉÄè„Ç≈ê›íËÇïœçXÇ≈Ç´Ç‹Ç∑Ç©ÅH

A: QuickTime Ç…ëgÇ›çûÇ‹ÇÍǃǢÇÈÅAÉÄÅ[ÉrÅ[Ç AVI ÉtÉ@ÉCÉãÇ…ÉGÉNÉXÉ|Å[ÉgÇ∑ÇÈÉRÉìÉ|Å[ÉlÉìÉgÇégópÇ∑ÇÍÇŒÅAÇ¢Ç≠ǬǩÇÃÉRÅ[ÉfÉbÉNÇégǡǃÉGÉNÉXÉ|Å[ÉgÇ≈Ç´Ç‹Ç∑ÅBÉfÉtÉHÉãÉgÇÕ Cinepak Ç≈Ç∑Ç™ÅAÉvÉçÉOÉâÉÄè„Ç≈ǪÇÃÉRÉìÉ|Å[ÉlÉìÉgÇ…ÅAï ÇÃÉRÉìÉvÉåÉbÉTÇégǧÇÊǧDžê›íËÇ∑ÇÈDZÇΔLJÇ≈Ç´Ç‹Ç∑ÅB MovieExportGetSettingsAsAtomContainer ÇégǡǃÅAÉGÉNÉXÉ|Å[Égê›íËÇ QTAtomContainer ÇΔǵǃéÊìæÇµÅAãÛä‘ê›íËÇïœçXǵÅA ǪÇÃå„ MovieExportSetSettingsFromAtomContainer ÇégǡǃÉGÉNÉXÉ|Å[ÉgÉRÉìÉ|Å[ÉlÉìÉgÇê›íËǵNjÇ∑ÅB

ÉäÉXÉg 1 ÇÕÅAIndeo 4 ÉRÅ[ÉfÉbÉNÅikIndeo4CodecTypeÅjÇégópÇ∑ÇÈÇΩÇflÇ…ÉvÉçÉOÉâÉÄÇ…ÇÊÇË AVI ÉGÉNÉXÉ|Å[ÉgÉRÉìÉ|Å[ÉlÉìÉgÇê›íËÇ∑ÇÈï˚ñ@Çé¶ÇµÇ‹Ç∑ÅBWindows RawÅikWindowsRawCodecTypeÅjÉRÅ[ÉfÉbÉNLJNjǡÇΩÇ≠ìØÇ∂ÇÊǧDžä»íPÇ…ëIëÇ≈Ç´Ç‹Ç∑ÅB


 OSErr SpitAVIMovie(const Movie inMovie, const FSSpecPtr inFile)
{
    ScriptCode           fileScript = smCurrentScript; // Windows Ç≈ÇÕ smSystemScript ÇégópÇ∑ÇÈ
    MovieExportComponent movieExporter = NULL;
    QTAtomContainer      exportSettings = NULL;
    QTAtom               videAtom = 0,
                         sptlAtom = 0;
    SCSpatialSettings    spatialSetting;
    OSErr                err = noErr;

    // AVI Çà 'spit' ÉRÉìÉ|Å[ÉlÉìÉgÇäJÇ≠
    err = OpenADefaultComponent(MovieExportType, kQTFileTypeAVI, &movieExporter);
    if (err || !movieExporter) goto bail;

    // ÉfÉtÉHÉãÉgÇÃê›íËÇéÊìæ
    err = MovieExportGetSettingsAsAtomContainer(movieExporter, &exportSettings);
    if (err) goto bail;

    // ãÛä‘ê›íËÇä‹Çfi 'vide' ÉAÉgÉÄÇíTÇ∑
    videAtom = QTFindChildByID(exportSettings, kParentAtomIsContainer,
                               kQTSettingsVideo,
                               1, NULL);
    if (0 == videAtom) { err = cannotFindAtomErr; goto bail; }

    // ãÛä‘ê›íËÅA'sptl' ÉAÉgÉÄÇíTÇ∑
    sptlAtom = QTFindChildByID(exportSettings, videAtom,
                               scSpatialSettingsType,
                               1, NULL);
    if (0 == sptlAtom) { err = cannotFindAtomErr; goto bail; }

    // é©êgÇÃê›íËÇçsǧ
    spatialSetting.codecType = EndianU32_NtoB(kIndeo4CodecType); // Ç‹ÇΩÇÕ kWindowsRawCodecType
    spatialSetting.codec = 0;
    spatialSetting.depth = EndianU16_NtoB(24);
    spatialSetting.spatialQuality = EndianU32_NtoB(codecLosslessQuality);

    // ê›íËÇîΩâfÇ∑ÇÈÇÊǧDžÉAÉgÉÄÉfÅ[É^ÇïœçXÇ∑ÇÈ
    err = QTSetAtomData(exportSettings, sptlAtom,
                        sizeof(spatialSetting),
                        &spatialSetting);
    if (err) goto bail;

    // ÉGÉNÉXÉ|Å[É^ÇÃê›íËÇçsǧ
    err = MovieExportSetSettingsFromAtomContainer(movieExporter, exportSettings);
    if (err) goto bail;

    // ÉGÉNÉXÉ|Å[ÉgÇ∑ÇÈ
    err = ConvertMovieToFile(inMovie, NULL, inFile, 0, 0, fileScript, NULL, 0, movieExporter);

bail:
    if (movieExporter) CloseComponent(movieExporter);
    if (exportSettings) QTDisposeAtomContainer(exportSettings);

    return err;
}
                  

ÉäÉXÉg 1Å@AVI Ç÷ÇÃÉGÉNÉXÉ|Å[Ég

éQçlï∂å£ÅF

Movie Data Exchange Documentation

ConvertMovieToFile API

Dispatch 6 - Finding Movie Export Components


[2002 îN 6 åé 18 ì˙]